package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"strings"
)

// 判断响应是否是文件类型
func isFileContentType(contentType string) bool {
	// 常见的文件 MIME 类型
	fileTypes := []string{
		"application/octet-stream", // 二进制文件
		"image/",                   // 图片类型
		"audio/",                   // 音频类型
		"video/",                   // 视频类型
		"application/pdf",          // PDF 文件
		"application/zip",          // ZIP 文件
	}

	for _, fileType := range fileTypes {
		if strings.HasPrefix(contentType, fileType) {
			return true
		}
	}
	return false
}

// GETFile 下载文件到内存中
func GETFile(url string) ([]byte, string, error) {
	// 发起 GET 请求
	resp, err := http.Get(url)
	if err != nil {
		return nil, "", fmt.Errorf("GET request failed: %v", err)
	}
	defer resp.Body.Close()

	// 检查响应状态码
	if resp.StatusCode != http.StatusOK {
		return nil, "", fmt.Errorf("GET request failed with status code: %d", resp.StatusCode)
	}
	// 获取 Content-Type
	contentType := resp.Header.Get("Content-Type")
	contentLength := resp.Header.Get("Content-Length")

	//// 判断是否为文件类型
	//if !isFileContentType(contentType) {
	//	return nil, "", fmt.Errorf("response is not a file, content type: %s", contentType)
	//}

	// 读取响应体
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, "", fmt.Errorf("failed to read response body: %v", err)
	}

	return body, contentType + ":" + contentLength, nil
}

// POSTFile 下载文件到内存中，POST 方法上传 JSON 数据
func POSTFile(url string, requestData interface{}) ([]byte, string, error) {
	// 将请求数据编码为 JSON
	jsonData, err := json.Marshal(requestData)
	if err != nil {
		return nil, "", fmt.Errorf("failed to marshal JSON data: %v", err)
	}
	// 创建一个 POST 请求，传递 JSON 数据
	resp, err := http.Post(url, "application/json", bytes.NewReader(jsonData))
	if err != nil {
		return nil, "", fmt.Errorf("POST request failed: %v", err)
	}
	defer resp.Body.Close()

	// 检查响应状态码
	if resp.StatusCode != http.StatusOK {
		return nil, "", fmt.Errorf("POST request failed with status code: %d", resp.StatusCode)
	}
	// 获取 Content-Type
	contentType := resp.Header.Get("Content-Type")
	contentLength := resp.Header.Get("Content-Length")

	// 判断是否为文件类型
	if !isFileContentType(contentType) {
		return nil, "", fmt.Errorf("response is not a file, content type: %s", contentType)
	}
	// 读取响应体
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, "", fmt.Errorf("failed to read response body: %v", err)
	}
	return body, contentType + ":" + contentLength, nil
}

func main() {
	url1 := "https://cdn.softswiss.net/logos/providers_small/black/bgaming.svg"
	url2 := "https://cdn.softswiss.net/l/upcoming.yaml"

	data1, type1, err := GETFile(url1)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("content-type: ", type1)
		fmt.Println(string(data1))
	}

	fmt.Println("---------------------")
	data2, type2, err := GETFile(url2)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("content-type: ", type2)
		fmt.Println(string(data2))
	}

}
